package org.chnxi.study.datastructrues.tree;

/**
 * 二叉树
 * @param <E>
 */
public class BinaryTree<E> {

    //记录根节点
    private TreeNode<E> root;

    public TreeNode<E> getRoot() {
        return root;
    }

    /**
     * 设置根节点
     *
     * @param node
     */
    public void setRoot(TreeNode<E> node) {
        this.root = node;
    }

    /**
     * 前序遍历
     */
    public void preOrder() {
        if (this.root != null) {
            this.root.preOrder();
        } else {
            System.out.println("TreeNode is Empty !");
        }
    }

    /**
     * 使用前序遍历查找
     * @param e 待查找元素
     * @return
     */
    public TreeNode<E> searchByPreOrder(E e){
        if (this.root != null) {
            return this.root.searchByPreOrder(e);
        } else {
            System.out.println("TreeNode is Empty !");
            return null;
        }
    }

    /**
     * 中序遍历
     */
    public void infixOrder() {
        if (this.root != null) {
            this.root.infixOrder();
        } else {
            System.out.println("TreeNode is Empty !");
        }
    }

    /**
     * 使用中序遍历进行查找
     * @param e 待查找元素
     * @return
     */
    public TreeNode<E> searchByInfixOrder(E e){
        if (this.root != null) {
            return this.root.searchByInfixOrder(e);
        } else {
            System.out.println("TreeNode is Empty !");
            return null;
        }
    }

    /**
     * 后序遍历
     */
    public void postOrder() {
        if (this.root != null) {
            this.root.postOrder();
        } else {
            System.out.println("TreeNode is Empty !");
        }
    }

    /**
     * 使用后序遍历进行查找
     * @param e 待查找元素
     * @return
     */
    public TreeNode<E> searchByPostOrder(E e){
        if (this.root != null) {
            return this.root.searchByPostOrder(e);
        } else {
            System.out.println("TreeNode is Empty !");
            return null;
        }
    }


    public boolean delTreeNode(E e){
        boolean result = false;
        //判断树是否为空
        if(root == null){
            return result;
        }

        if(root.getE().equals(e)){  //判断根节点是否为待删除节点
            root = null;
            result = true;
        }else{ //开始判断子树
            result = root.delTreeNode(e);
        }

        return result;
    }
}